package com.gitee.generator.universal.common;

import cn.hutool.core.text.CharSequenceUtil;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;

/**
 * DataTypeEnum
 * @date 2020-08-19 11:24
 * @author wsx
 */
@Slf4j
@Getter
@AllArgsConstructor
public enum DataTypeEnum {
    /*tinyint类型*/
    TINYINT("TINYINT", "Integer","java.lang.Integer",false),
    /*tinyint类型*/
    BIT("BIT", DataTypeEnum.TINYINT.fieldType,DataTypeEnum.TINYINT.wholeFieldType,false),
    /*smallint类型*/
    SMALLINT("SMALLINT", DataTypeEnum.TINYINT.fieldType,DataTypeEnum.TINYINT.wholeFieldType,false),
    /*int类型*/
    INT("INT", DataTypeEnum.TINYINT.fieldType,DataTypeEnum.TINYINT.wholeFieldType,false),
    /*integer类型*/
    INTEGER("INTEGER", DataTypeEnum.TINYINT.fieldType,DataTypeEnum.TINYINT.wholeFieldType,false),
    /*bigint类型*/
    BIGINT("BIGINT", "Long","java.lang.Long",false),
    /*varchar类型*/
    VARCHAR("VARCHAR", "String","java.lang.String",false),
    /*varchar2类型*/
    VARCHAR2("VARCHAR2", DataTypeEnum.VARCHAR.fieldType,DataTypeEnum.VARCHAR.wholeFieldType,false),
    /*BLOB类型*/
    BLOB("BLOB", DataTypeEnum.VARCHAR.fieldType,DataTypeEnum.VARCHAR.wholeFieldType,false),
    /*char类型*/
    CHAR("CHAR", DataTypeEnum.VARCHAR.fieldType,DataTypeEnum.VARCHAR.wholeFieldType,false),
    /*datetime类型*/
    DATETIME("DATETIME", "Date","java.util.Date",true),
    /*date类型*/
    DATE("DATE", DataTypeEnum.DATETIME.fieldType,DataTypeEnum.DATETIME.wholeFieldType,true),
    /*float类型*/
    FLOAT("FLOAT", "Float","java.lang.Float",false),
    /*double类型*/
    DOUBLE("DOUBLE", "Double","java.lang.Double",false),
    /*decimal类型*/
    DECIMAL("DECIMAL", "BigDecimal","java.math.BigDecimal",true),
    /*timestamp类型*/
    TIMESTAMP("TIMESTAMP", DataTypeEnum.DATETIME.fieldType,DataTypeEnum.DATETIME.wholeFieldType,true),
    /*text类型*/
    TEXT("TEXT", DataTypeEnum.VARCHAR.fieldType,DataTypeEnum.VARCHAR.wholeFieldType,false),
    /*enum类型*/
    ENUM("ENUM", DataTypeEnum.VARCHAR.fieldType,DataTypeEnum.VARCHAR.wholeFieldType,false);

    /** 数据库类型 */
    private final String dbType;
    /** java类型 */
    private final String fieldType;
    /** java类型全路径 */
    private final String wholeFieldType;
    /** 是否需要导入 */
    private final boolean needImport;
    /**
     * 通过数据库类型获取枚举
     * @param dbType 数据库类型
     * @return 枚举
     */
    public static DataTypeEnum getEnumByDbType(String dbType){
        if(CharSequenceUtil.isNotBlank(dbType)){
            dbType = dbType.replace("UNSIGNED","").trim();
            for(DataTypeEnum dataTypeEnum : DataTypeEnum.values()){
                if(dataTypeEnum.getDbType().equalsIgnoreCase(dbType)){
                    return dataTypeEnum;
                }
            }
        }
        log.error("未能解析的数据库类型：{}",dbType);
        return null;
    }
    /**
     * 通过数据库类型获取java属性
     * @param dbType 数据库类型
     * @return java属性
     */
    public static String getFieldType(String dbType){
        DataTypeEnum typeEnum = getEnumByDbType(dbType);
        if(null!=typeEnum){
            return typeEnum.fieldType;
        }
        return null;
    }
    /**
     * 通过数据库类型获取java类型全路径
     * @param dbType 数据库类型
     * @return java类型全路径
     */
    public static String getWholeFieldType(String dbType){
        DataTypeEnum typeEnum = getEnumByDbType(dbType);
        if(null!=typeEnum){
            return typeEnum.getWholeFieldType();
        }
        return null;
    }
    /**
     * 处理数据库类型转换
     * @param type 数据库类型
     * @return 数据库类型转换
     */
    public static String tranceDBType(String type){
        String t = type.split(" ")[0];
        if(DataTypeEnum.INT.dbType.equals(t)){
            t = DataTypeEnum.INTEGER.dbType;
        }
        if(DataTypeEnum.BIT.dbType.equals(t)){
            t = DataTypeEnum.TINYINT.dbType;
        }
        return t;
    }
}
